﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace Model
{
    public class Server
    {
        //Variabler
        private Auktion auktion;
        private bool kører = true;   

        TcpListener listener;
        private int port;


        //Konstruktør, som starter listeneren så der lyttes efter Klienter
        public Server(int port, Auktion auktion)
        {
            this.port = port;
            this.auktion = auktion;
            this.listener = new TcpListener(IPAddress.Any, port);
            listener.Start();
        }

        //Start metoden som skal køres i en tråd. Denne instansierer et Socket objekt, som bliver koblet på listener'ens AcceptSocket metode.
        //Hver gang det bliver oprettet en ny Socket bliver der skrevet på serversiden at der er en ny "klient"(klienthandler.
        //Ud over dette bliver tråden der bliver oprettet sat til IsBackground, så hvis serveren lukkes, lukkes denne tråd også,
        //Så garbagecollecteren ikke skal til at arbejde med ufærdige tråde i hukommelsen
        //Sidst men ikke mindst ligger alt dette i en try/catch som ganske almindelig exceptionhandling.
        public void Start()
        {
            while (kører)
            {
                try

                {
                    Socket klient = listener.AcceptSocket();
                    Console.WriteLine("Ny Klient ip: " + klient.RemoteEndPoint.ToString());
                    KlientHandler klientHandler = new KlientHandler(klient,auktion);
                    Thread klientHandlerTråd = new Thread(new ThreadStart(klientHandler.Start));
                    klientHandlerTråd.IsBackground = true;
                    klientHandlerTråd.Start();
                }

                catch (SocketException)
                {
                    Console.WriteLine("Listener on socket closed");
                }

                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }

        //Stop metode til at stoppe her og videre ned igennem programmet
        public void Stop()
        {
            kører = false;
            listener.Stop();
        }

        //Get- Set- Metode
        public bool Running
        {
            get { return kører; }
        }
    }
}
